package org.elasticsearch.test.batchpercolator.rest; import com.jayway.jsonpath.Filter; import com.jayway.jsonpath.JsonPath; import com.meltwater.elasticsearch.action.BatchPercolateSourceBuilder; import com.meltwater.elasticsearch.index.BatchPercolatorService; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.Response; import org.elasticsearch.client.Client; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.collect.ImmutableList; import org.elasticsearch.common.collect.ImmutableMap; import org.elasticsearch.common.collect.Lists; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.search.highlight.HighlightBuilder; import org.elasticsearch.test.integration.AbstractNodesTests; import org.hamcrest.CoreMatchers; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import static com.jayway.jsonpath.Criteria.where; import static com.jayway.jsonpath.Filter.filter; import static com.meltwater.elasticsearch.action.BatchPercolateSourceBuilder.docBuilder; import static org.elasticsearch.common.xcontent.ToXContent.EMPTY_PARAMS; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.query.QueryBuilders.termQuery; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; public class BatchPercolatorRestTest extends AbstractNodesTests { static Client client; @BeforeClass public static void createNodes() throws Exception { startNode("node1"); client = client("node1"); } @AfterClass public static void closeNodes() { closeAllNodesAndClear(); } @Test public void basicRestPercolationTest() throws ExecutionException, InterruptedException, IOException { AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); final String docId = "docId"; logger.info("--> Add dummy doc"); client.admin().indices().prepareDelete("_all").execute().actionGet(); client.prepareIndex("test", "type", "1") .setSource("field1", "value", "field2", "value").execute().actionGet(); logger.info("--> register query1 with highlights"); client.prepareIndex("test", BatchPercolatorService.TYPE_NAME, "1") .setSource(getSource(termQuery("field1", "fox"), new HighlightBuilder().field("field1").preTags("<b>").postTags("</b>"))) .execute().actionGet(); logger.info("--> register query2 with highlights"); client.prepareIndex("test", BatchPercolatorService.TYPE_NAME, "2") .setSource(getSource(termQuery("field2", "meltwater"), new HighlightBuilder() .requireFieldMatch(true) .order("score") .highlightQuery(termQuery("field2", "meltwater")) .field("field2") .preTags("<b>") .postTags("</b>"))) .execute().actionGet(); logger.info("--> Doing percolation with Rest API"); BytesReference source = new BatchPercolateSourceBuilder().addDoc( docBuilder().setDoc(jsonBuilder() .startObject() .field("_id", docId) .field("field1", "the fox is here") .field("field2", "meltwater percolator") .endObject())) .toXContent(JsonXContent.contentBuilder(), EMPTY_PARAMS).bytes(); Response restResponse = asyncHttpClient.preparePost("http://localhost:9200/test/type/_batchpercolate") .setHeader("Content-type", "application/json") .setBody(source.toUtf8()) .execute() .get(); assertThat(restResponse.getStatusCode(), equalTo(200)); String responseBody = restResponse.getResponseBody(); List<String> results = JsonPath.read(responseBody, "$.results"); assertThat(results.size(), is(1)); String matchedDoc = JsonPath.read(responseBody, "$.results[0].doc"); assertThat(matchedDoc, is(docId)); List<String> matches = JsonPath.read(responseBody, "$.results[0].matches"); assertThat(matches.size(), is(2)); assertThat(JsonPath.<List<String>>read(responseBody, "$.results[0].matches[?(@.query_id==1)].query_id").get(0), is("1")); assertThat(JsonPath.<List<String>>read(responseBody, "$.results[0].matches[?(@.query_id==1)].highlights.field1[0]").get(0), is("the <b>fox</b> is here")); assertThat(JsonPath.<List<String>>read(responseBody, "$.results[0].matches[?(@.query_id==2)].query_id").get(0), is("2")); assertThat(JsonPath.<List<String>>read(responseBody, "$.results[0].matches[?(@.query_id==2)].highlights.field2[0]").get(0), is("<b>meltwater</b> percolator")); } }